<!DOCTYPE HTML>
<html>

<head>
	<link rel="bookmark"  type="image/x-icon"  href="/img/HankyDlogo.jpg"/>
	<link rel="shortcut icon" href="/img/HankyDlogo.jpg">
	
			    <title>
    Hexo
    </title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
    <link rel="stylesheet" href="/css/mic_main.css" />
    <link rel="stylesheet" href="/css/dropdownMenu.css" />
    <meta name="keywords" content="HankyD blog" />
    
    	<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
	 
    <noscript>
        <link rel="stylesheet" href="/css/noscript.css" />
    </noscript>
    <style type="text/css">
        body:before {
          content: ' ';
          position: fixed;
          top: 0;
          background: url('/img/bg.jpg') center 0 no-repeat;
          right: 0;
          bottom: 0;
          left: 0;
          background-size: cover; 
        }
    </style>

			    
  
    <script type="text/x-mathjax-config">
      MathJax.Hub.Config({
        tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
        }
      });
    </script>

    <script type="text/x-mathjax-config">
      MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for (i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
        }
      });
    </script>
    <script async type="text/javascript" src="//cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
  


    <script src="/js/jquery.min.js"></script>
    <script src="/js/jquery.scrollex.min.js"></script>
    <script src="/js/jquery.scrolly.min.js"></script>
    <script src="/js/skel.min.js"></script>
    <script src="/js/util.js"></script>
    <script src="/js/main.js"></script>
	
<meta name="generator" content="Hexo 5.4.0"></head>
    
		
<!-- Layouts -->



<!--  代码渲染  -->
<link rel="stylesheet" href="/css/prism_coy.css" />
<link rel="stylesheet" href="/css/typo.css" />
<!-- 文章页 -->
<body class="is-loading">
    <!-- Wrapper 外包 s-->
    <div id="wrapper" class="fade-in">
        <!-- Intro 头部显示 s -->
        <!-- Intro 头部显示 e -->
        <!-- Header 头部logo start -->
        <header id="header">
    <a href="/" class="logo">开始</a>
</header>
        <!-- Nav 导航条 start -->
        <nav id="nav" class="special" >
            <ul class="menu links" >
			<!-- Homepage  主页  --> 
			<li >
	            <a href="/" rel="nofollow">主页</a>
	        </li>
			<!-- categories_name  分类   --> 
	        
	        <li class="active">
	            <a href="#s1">分类</a>
	                    <ul class="submenu">
	                        <li>
	                        <a class="category-link" href="/categories/database/">database</a></li><li><a class="category-link" href="/categories/%E5%BB%BA%E7%AB%99/">建站</a></li><li><a class="category-link" href="/categories/%E6%9D%82%E9%A1%B9/">杂项</a>
	                    </ul>
	        </li>
	        
	        <!-- archives  归档   --> 
	        
	        <li class="active">
	            <a href="#s1">归档</a>
	                    <ul class="submenu">
	                        <li>
	                        <a class="archive-link" href="/archives/2021/07/">July 2021</a></li><li><a class="archive-link" href="/archives/2021/06/">June 2021</a>
	                    </ul>
	        </li>
	        
	        
		        <!-- Pages 自定义   -->
		        
		        <li>
		            <a href="/tag/" title="标签">
		                标签
		            </a>
		        </li>
		        
		        <li>
		            <a href="/about/" title="我">
		                我
		            </a>
		        </li>
		        


            </ul>
            <!-- icons 图标   -->
			<ul class="icons">
                    
                    <li>
                        <a title="github" href="https://gitee.com/Hanky_D" target="_blank" rel="noopener">
                            <i class="icon fa fa-github"></i>
                        </a>
                    </li>
                    
			</ul>
</nav>

        <div id="main" >
            <div class ="post_page_title_img" style="height: 25rem;background-image: url(https://images.unsplash.com/photo-1602605786056-da87eadb5126?ixid=MnwxMjA3fDB8MHx0b3BpYy1mZWVkfDN8dG93SlpGc2twR2d8fGVufDB8fHx8&amp;ixlib=rb-1.2.1&amp;auto=format&amp;fit=crop&amp;w=500&amp;q=60);background-position: center; background-repeat:no-repeat; background-size:cover;-moz-background-size:cover;overflow:hidden;" >
                <a href="#" style="padding: 4rem 4rem 2rem 4rem ;"><h2 >数据库系统原理知识点</h2></a>
            </div>
            <!-- Post -->
            <div class="typo" style="padding: 3rem;">
                <p>1.数据库系统管理系统主要特点</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">数据结构化，和文件系统的本质区别</span><br><span class="line"></span><br><span class="line">数据共享度高，冗余度低，易扩充、避免不一致性</span><br><span class="line"></span><br><span class="line">数据独立性高（数据独立性即应用程序和数据结构、物理独立性即应用程序和数据库物理结构、逻辑独立性即应用程序和逻辑独立性）</span><br><span class="line"></span><br><span class="line">数据由数据库管理系统统一管理</span><br></pre></td></tr></table></figure>

<p>2.数据模型：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">概念模型：ER，对用户认识建模</span><br><span class="line"></span><br><span class="line">逻辑模型：按计算机系统观点对数据建模，主要用于DBMS实现</span><br><span class="line"></span><br><span class="line">物理模型</span><br></pre></td></tr></table></figure>

<br/>

<p>3.数据库三阶段：人工管理、文件系统、数据库阶段</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">三组成要素：数据结构、数据操作、数据完整性约束</span><br><span class="line"></span><br><span class="line">层次模型：数据完整性好、效率高、结构清晰，但不能表达多对多联系，有冗余数据</span><br><span class="line"></span><br><span class="line">网状模型：性能好，值观描述世界，但结构复杂</span><br></pre></td></tr></table></figure>

<br/>

<p>4.数据库三级模式：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">模式，即逻辑模式，对应于逻辑层数据抽象，对全体数据的逻辑结构和特征描述，模式具体值称为实例，</span><br><span class="line"></span><br><span class="line">外模式，子模式用户模式，视图层数据抽象，局部数据逻辑结构和特征，与具体应用有关，，保证数据库安全性</span><br><span class="line"></span><br><span class="line">内模式，存储模式，物理层数据抽象</span><br></pre></td></tr></table></figure>

<p>5.两层映像 保证独立性</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1）外模式/模式，视图层数据抽象，保证了数据与应用程序的逻辑独立性</span><br><span class="line"></span><br><span class="line">2）模式/内模式,数据与应用程序的物理独立性，物理层</span><br><span class="line"></span><br><span class="line">模式是核心和关键，首先需要确定数据库逻辑模式</span><br></pre></td></tr></table></figure>

<br/>

<p>6.实体完整性：主码不可以是空值，如果是属性集，则每一个属性都不可以空</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">参照完整性：外码要么为null，要么一定和对应的主码相等</span><br></pre></td></tr></table></figure>

<p>7.五种基本代数运算：基本的关系代数运算有选择、投影、集合并、集合差、笛卡尔积</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">集合交可以用这个表示r∩s = r-(r-s)</span><br><span class="line"></span><br><span class="line">关系操作的特点是集合操作方式，非关系数据模型的数据操作方式则为一次一个记录的方式。</span><br></pre></td></tr></table></figure>

<p>7.聚合函数可以用在where中，但可以用在子查询中和having中</p>
<p>8.关系代数中链接操作有选择同埋笛卡尔积搞掂</p>
<p>9.专门运算关系：选择投影连接</p>
<p>10.二元联系集的主码选择</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1）一对一：任意一方实体集主码</span><br><span class="line"></span><br><span class="line">2）一对多：多的一方</span><br><span class="line"></span><br><span class="line">3）多对多：所有实体集的主码</span><br></pre></td></tr></table></figure>

<p>二元联系集的属性安置：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">一对一和一对多的联系集属性都可以按照上方的规则或放在联系集上</span><br><span class="line"></span><br><span class="line">多对多则只能安置于联系集上</span><br></pre></td></tr></table></figure>

<p>11.标识实体集和弱实体集必须是一对多联系集，且弱实体集全部参与（使用双连线）</p>
<p>12.ER模型转化方法：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">1）强实体集：直接转化，主码画下划线</span><br><span class="line"></span><br><span class="line">2）弱实体集：主码为标识实体集的主码和自己的部分码。外码为标识实体集的主码（斜体）</span><br><span class="line"></span><br><span class="line">3）联系集：一对多或一对一可不转化单独模式，则在多方转化的模式中增加一方的主码作为外码，同时将联系属性也放入多方；若是一对一联系，就一方主码当成另一方外码就可以了</span><br><span class="line"></span><br><span class="line">4）标识联系集不转</span><br><span class="line"></span><br><span class="line">5）复合属性要拆开放在模式里面</span><br><span class="line"></span><br><span class="line">6）多值属性转化为一个新的关系模式，属性是多值属性所在的实体集的主码和该多值属性，且全是主码</span><br><span class="line"></span><br><span class="line">7）多对多联系集，两边的主码当成自己的</span><br></pre></td></tr></table></figure>

<br/>

<p>规范化目的：使数据库的逻辑结构更合理，消除插入、修改、删除异常，减少数据冗余</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">数据冗余尽可能少，即数据共享高</span><br><span class="line"></span><br><span class="line">不发生插入异常、删除异常、更新异常</span><br><span class="line"></span><br><span class="line">分解后无损链接，保持依赖</span><br></pre></td></tr></table></figure>

<p>平凡函数依赖：对于任一关系模式，都必有平凡函数依赖，不反应新的语义</p>
<p>对候选码的部分函数依赖会导致数据冗余和插入、删除、更新异常</p>
<br/>

<br/>

<p>第一范式1NF：属性不可分</p>
<p>第二范式2NF：所有非主属性完全函数依赖于候选码，即不允许候选码的一部分对非主属性起决定作用</p>
<p>第三范式3NF：所有非主属性都直接依赖全部候选码，没有传递依赖，如果没有非主属性，则直接3范式</p>
<p>bc范式：排除任何属性对候选码的部分和传递依赖，排除了主属性之间的传递依赖，分解不一定是保持依赖分解，要求所有非平凡依赖的a是超码</p>
<br/>

<p>修改基本表操作的语法为(<tableName>为待修改表的名称)：<br>增加列（新增一列的值为空值）：<br>ALTER TABLE <tableName><br>     ADD <columnName> <dataType><br>增加约束：<br>ALTER TABLE <tableName><br>     ADD CONSTRAINT <constraintName><br>删除约束：<br>ALTER TABLE <tableName><br>     DROP <constraintName><br>修改列的数据类型：<br>ALTER TABLE <tableName><br>     ALTER COLUMN <columnName> <newDataType></p>
<p>基本表在修改过程中，不可以删除列，一次仅执行一种操作。</p>
<p>删除表</p>
<p>DROP TABLE <tableName> [RESTRICT | CASCADE]</p>
<br/>

<p>插入记录</p>
<p>INSERT INTO Student(studentName, birthday, studentNo)<br> VALUES ( ‘章李立’, ‘1991-10-12 00:00’, ‘0700007’ )，可以不按顺序</p>
<p>INSERT INTO StudentNation(studentNo, courseNo, termNo)<br>      SELECT studentNo, courseNo, termNo<br>      FROM Score<br>      WHERE studentNo IN (<br>                       SELECT studentNo<br>                       FROM Student<br>                       WHERE nation=’汉族’ )</p>
<br/>

<p>删除表中记录才是delete  </p>
<p>DELETE FROM Score<br>WHERE studentNo=’1600001’</p>
<p>修改数据</p>
<p>UPDATE Score<br>SET score=88<br>FROM Score a, Student b<br>WHERE a.studentNo=b.studentNo AND courseNo=’002’<br>      AND termNo=’151’ AND studentName=’王红敏’</p>
<br/>

<p>视图：</p>
<p>视图是虚表，是从一个或几个基本表(或视图)中导出的表。</p>
<p>在数据字典(数据库系统表)中仅存放视图的定义，不存放视图对应的数据。<br>当基本表中的数据发生变化时，从视图中查询出的数据也随之改变。<br>视图实现了数据库管理系统三级模式中的外模式。<br>基于视图的操作包括：<br>查询、删除、受限更新和创建基于该视图的新视图。<br>视图的主要作用是：<br>简化用户的操作；<br>使用户能以多种角度看待同一数据库模式；<br>对重构数据库模式提供了一定程度的逻辑独立性；<br>能够对数据库中的机密数据提供一定程度的安全保护；<br>适当的利用视图可以更清晰的表达查询。</p>
<br/>

<p>创建视图：<br>CREATE VIEW <viewName> [(<columnName1> [, <columnName2> … ]) ]</p>
<p>AS<br><subquery><br>[WITH CHECK OPTION]则必须运行where里面的语句</p>
<p>子查询不允许有orderby和distinct</p>
<br/>

<p>当视图是基于一个基本表创建的，且保留了主码属性，这样的视图称为行列子集视图。</p>
<p>视图可以创建在视图上。</p>
<p>从系统的角度来看，查询视图的过程是：<br>有效性检查：检查查询中涉及的基本表和视图是否存在？<br>从数据字典中取出创建视图的语句，将创建视图的子查询与用户的查询结合起来，转换成等价的对基本表的查询；<br>执行改写后的查询。</p>
<br/>

<p>更新视图：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">如果创建视图的语句中包含了表达式，或聚合运算，或消除重复值运算，则不能对视图进行更新操作。</span><br></pre></td></tr></table></figure>

<p>UPDATE StudentView1999<br>    SET studentName=’张小立’<br>    WHERE studentNo=’1600004’</p>
<p>转化为：</p>
<p>UPDATE Student<br>  SET studentName=’张小立’<br>  WHERE year(birthday)=1999 AND studentNo=’1600004’</p>
<p>结合了子查询</p>
<br/>

<p>删除视图：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DROP VIEW &lt;viewName&gt; [CASCADE]</span><br></pre></td></tr></table></figure>

<p>存储过程：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">编译后放在数据库中，可以重新编译</span><br><span class="line"></span><br><span class="line">虽然科以客户端远程调用，但是最终都还是在服务区端</span><br><span class="line"></span><br><span class="line">优点：业务操作封装、便于事务管理、安全保护、适合统计和查询</span><br></pre></td></tr></table></figure>

<br/>

<p>创建存储过程：CREATE PROCEDURE proStudentByNo1(@sNo char(7))//默认为输入变量，可加OUTPUT</p>
<p>AS<br>        SELECT a.studentNo, studentName, avg(score)<br>        FROM Student a, Score b<br>        WHERE a.studentNo=b.studentNo<br>              AND a.studentNo=@sNo<br>        GROUP BY a.studentNo, studentName</p>
<p>执行存储过程：</p>
<p>DECLARE @avg numeric(5, 1)</p>
<p>EXECUTE proStudentByNo2 ‘1600001’, @avg OUTPUT<br>SELECT @avg</p>
<br/>

<p>删除存储过程：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DROP PROCEDURE &lt;procedureName&gt;</span><br></pre></td></tr></table></figure>

<br/>

<p>触发器：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">触发器(trigger)是用户定义在关系表上的一类由事件驱动的存储过程，由服务器自动激活,是一种特殊的存储过程，不管什么原因造成的数据变化都能自动响应。常用于保证完整性，一定程度上实现完全性</span><br></pre></td></tr></table></figure>

<p>当SQL语句执行完毕， deleted表、inserted表也随即被删除。</p>
<br/>

<p>触发器仅在当前数据库中被创建<br>触发器有3种类型，即插入、删除和修改；<br>插入、删除或修改也可组合起来作为一种类型的触发器；<br>查询操作不会产生触发动作，没有查询触发器类型。</p>
<br/>

<p>触发器常常用于维护复杂的完整性约束，不用于业务处理。</p>
<p>一般能使用约束限制就不用触发器</p>
<br/>

<p>索引：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">顺序索引：索引的记录（索引项）基于搜索吗顺序排列，</span><br><span class="line"></span><br><span class="line">            组织结构：在索引中按搜索码值得书匈奴存储索引项，并将索引项于包含改索引项中搜索码值得文件记录关联，通过指针。</span><br><span class="line"></span><br><span class="line">散列索引：</span><br><span class="line"></span><br><span class="line">    索引中的记录(索引项)基于搜索码值的散列函数(即哈希函数)的值平均、随机地分布到若干个散列桶中。</span><br></pre></td></tr></table></figure>

<br/>

<p>建立了索引的文件称为索引文件(指数据文件)。索引文件中的记录自身可以按照某种排序顺序存储。一个索引文件可以有多个索引，分别对应于不同的搜索码。<br>如果索引文件中的记录按照某个搜索码值指定的顺序物理存储，那么该搜索码对应的索引就称为主索引(primary index)，也叫聚集索引(clustering index)。<br>与此相反，搜索码值顺序与索引文件中记录的物理顺序不同的那些索引称为辅助索引(secondary index)或非聚集索引(nonclustering index)。 </p>
<br/>

<p>查询处理是指从数据库中提取数据时所涉及得一系列活动，过程包括：语法分析与翻译、查询优化、查询执行。</p>
<p>语法分析与翻译器<br>语法分析与翻译阶段的主要工作有：<br>检查用户查询的语法，并利用数据字典验证查询中出现的关系名、属性名等是否正确；</p>
<p>构造该查询语句的语法分析树，并将其翻译成关系代数表达式。 </p>
<br/>

<p>执行一个查询，不仅需要提供关系代数表达式，还要对该关系代数表达式加上注释来说明如何执行每个关系运算。生成查询执行计划。 </p>
<p>不同的查询执行计划会有不同的代价。构造具有最小查询执行代价的查询执行计划称为查询优化，由查询优化器来完成。 </p>
<p>查询优化是影响RDBMS性能的关键因素。 </p>
<br/>

<p>查询执行引擎根据输入的查询执行计划，调用相关算法实现查询计算，并将计算结果返回给用户。</p>
<p>有效地对内存缓冲区进行管理是影响查询执行性能的非常重要的方面。</p>
<br/>

<p>查询代价度量：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">通过该查询对各种资源得使用情况进行度量，包括磁盘存取时间、执行一个查询所使用得CPU时间，以及在并行/分布式数据库系统中得通信开销。</span><br></pre></td></tr></table></figure>

<p>对于大型数据库系统而言，在磁盘上存取数据的代价通常是最重要的代价 ，可以通过传输磁盘块数以及搜索磁盘次数来度量。 </p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">代价估算假定是最坏得情况</span><br></pre></td></tr></table></figure>

<br/>

<p>查询优化：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">一个查询通常会有多种执行策略，查询优化就是从中选择最有效的查询执行计划，期望RDBMS能够构造并选择出一个具有最小查询执行代价的查询执行计划。</span><br></pre></td></tr></table></figure>

<p>分成三步：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">逻辑优化：即产生逻辑上与给定关系代数表达式等价得关系代数表达式。</span><br><span class="line"></span><br><span class="line">代价估计：即估计每个查询执行计划得代价</span><br><span class="line"></span><br><span class="line">物理优化：对产生的表达式以不同方式做注释，产生不同的查询执行计划。</span><br></pre></td></tr></table></figure>

<p>查询优化器中式逻辑优化和物理优化交叉进行</p>
<br/>

<p>选择最佳查询执行计划？<br>一种方法是搜索所有的查询执行计划，基于代价估计选择最佳的查询执行计划；<br>第二种是使用启发式策略选择查询执行计划。<br>实际中的查询优化器将两种方法结合起来使用。</p>
<br/>

<p>基于代价的优化：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">通过使用等价规划从给定的查询语句产生一系列的查询执行计划，选择代价最小的，一般是寻找接近最优的就可以了</span><br></pre></td></tr></table></figure>

<p>启发式优化：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">减少优化本身的代价，使用一些启发式规则，如今早执行选择操作，尽早投影</span><br></pre></td></tr></table></figure>

<br/>

<p>数据库安全性：保护数据库以防止不合法使用所造成的数据泄密、更改或破坏。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">目标是确保只有授权用户才能访问数据库，未被授权的人无法接近数据，安全措施是指用户或应用程序访问数据库需要经过安全认证过程。</span><br><span class="line"></span><br><span class="line">用户标识与鉴别：用户名和密码</span><br><span class="line"></span><br><span class="line">数据库安全保护：进入后，执行操作海需通过“存取控制”或试图进行权限分配</span><br><span class="line"></span><br><span class="line">    存取控制：决定用户对数据库中的哪些对象进行操作，进行何种操作。包括两部分：定义用户权限（登记到数据字典）和合法权限检查。    </span><br><span class="line"></span><br><span class="line">    视图：通过为不同用户定义不同的视图，达到限制用户访问范围的目的。</span><br><span class="line"></span><br><span class="line">            隐藏用户无权存取的数据，一般将视图和存储控制结合使用。</span><br></pre></td></tr></table></figure>

<p>权限授予和收回：GRANT和REVOKE，有目标权限和命令权限</p>
<p>命令权限，指DDL：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">GRANT：如果具有创建对象的create权限，则自动具有其创建对象的修改alter权限和删除drop权限；</span><br><span class="line"></span><br><span class="line">    对于基本表，自动具有在所创建表上创建、删除和修改触发器的权限</span><br><span class="line"></span><br><span class="line">    修改alter和删除drop权限不额外授权</span><br><span class="line">    </span><br></pre></td></tr></table></figure>

<p>将创建基本表和视图的权限授予用户u1和u2<br>GRANT create table, create view TO u1, u2；<br>从用户u2收回创建视图的权限<br>REVOKE create view FROM u2</p>
<br/>

<p>目标权限：指DML</p>
<p><command_list>可以是update、select、insert、delete、excute和all</p>
<p>excute针对存储过程授予执行权限；<br>update、select、insert、delete针对基本表和视图授权；<br>all表示所有的权限。</p>
<p>对象的创建者自动拥有该对象的插入、删除、修改和查询操作权限；存储过程的创建者自动拥有所创建过程的执行权限</p>
<p>CASCADE：级联收回；<br>RESTRICT：缺省值，若转赋了权限，则不能收回；<br>WITH GRANT OPTION：允许将指定对象上的目标权限授予其它安全用户。</p>
<p>不允许循环授权，</p>
<br/>

<p>将对学生表Student的性别、出生日期的查询和修改权限授予用户u3、u4和u5，且不可以转授权限：<br> GRANT select, update ON Student(sex, birthday) TO u3, u4, u5 </p>
<p>若使用了select * ，则必须对表的所有列赋予select权限</p>
<br/>

<br/>

<p>收回：</p>
<p>用户u2将转授给用户u4的对表Score的修改和查询权限收回：<br>REVOKE select, update ON Score FROM u4 CASCADE<br>本例必须级联收回，因为用户u4将对表Score的查询和删除权限转授给了用户u6。</p>
<br/>

<p>数据库完整性：<br>    完整性约束条件作用的对象可以是关系、元组、列三种：</p>
<p>列约束：在定义属性的同时定义该属性应满足的约束条件，主要是定义属性的数据类型、取值范围和精度、默认值、是否允许空值、是否唯一、单一属性主码等约束条件；<br>元组约束：定义元组中属性间的联系的约束条件；在定义属性之后单独定义；<br>关系约束：定义若干元组间、关系集合上以及关系之间的联系的约束条件，亦称为表约束；在定义属性之后单独定义。</p>
<br/>

<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">静态约束，指数据库每一确定状态时的数据对象所应满足的约束条件，反映数据库状态合理性的约束。</span><br></pre></td></tr></table></figure>

<p>静态列约束：对列的取值域的说明，包括以下几方面：<br>对数据类型的约束，包括数据的类型、长度、单位、精度等；<br>对数据格式的约束；<br>对取值范围或取值集合的约束；<br>对空值的约束；<br>其他约束。<br>静态元组约束：规定元组的各个列之间的约束关系。<br>静态关系约束：在一个关系的各个元组之间或者若干关系之间常存在各种联系或约束。常见的静态关系约束有：<br>实体完整性约束；<br>参照完整性约束；<br>函数依赖约束，大部分函数依赖约束都在关系模式中定义；<br>统计约束，字段值与关系中多个元组的统计值之间的约束关系</p>
<br/>

<p>动态约束：指数据库从一种状态转变为另一种状态时的新、旧值之间所应满足的约束条件。<br>反映数据库状态变迁的约束；</p>
<br/>

<p>使用ALTER TABLE语句修改基本表中的完整性约束。<br>要修改约束，必须先删除约束，然后加入新的约束。</p>
<p>实体完整性要求基本表的主码值唯一且不允许为空值</p>
<p>对单属性构成的主码可定义为列约束, 也可定义为元组约束;<br>对多个属性构成的主码，只能定义为元组约束(也有的书将其划归关系约束，即表约束) 。</p>
<p>实体完整性的检查和违约处理：主码唯一且是否为空</p>
<p>外码约束只能匿名，即无CONSTRAIN关键字</p>
<br/>

<p>参照约束：拒绝(NO ACTION)执行，是系统的默认策略，级联(CASCADE)操作。当删除或修改被参照关系的某些元组造成了与参照关系的不一致时，则自动级联删除或修改参照关系中所有不一致的元组。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">参照关系中可以随意删除元组。被参照关系可以随意插入新元组。互不影响</span><br></pre></td></tr></table></figure>

<p>ONSTRAINT ScoreFK1 FOREIGN KEY (studentNo)<br>             REFERENCES Student (studentNo)<br>             ON DELETE CASCADE     /* 级联删除参照关系Score中相应的元组 */</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">审计：监视措施，用于跟踪并记录有关数据的访问活动，审计跟踪把用户对数据库的所有操作自动记录下来，放在审计日志中，审计日志包括：操作类型、操作终端和操作者标识、操作时间、涉及的数据和数据亲啊后映像。</span><br></pre></td></tr></table></figure>

<br/>

<p>修改约束：删除约束：<br>ALTER TABLE <tableName><br>         DROP CONSTRAINT <constraintName><br>添加约束：<br>ALTER TABLE <tableName><br>     ADD CONSTRAINT <constraintName><br>         &lt; CHECK | UNIQUE | PRIMARY KEY | FOREIGN KEY &gt;<br>                     (<constraintExpr>)</p>
<p>先删除，再添加</p>
<br/>

<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">审计带来系统开销，一般不开启。</span><br></pre></td></tr></table></figure>

<p>最小化审计选项来降低审计跟踪记录个数，如仅跟踪user01用户。</p>
<p>监视或定期删除审计跟踪记录。<br>避免审计跟踪记录被非法用户删除。定义的审计表只能DBA操作，任何其它用户没有操作权限。</p>
<br/>

<p>访问控制和存取控制可将用户的应用系统访问范围最小化和数据对象操作权限最低化，但对一些敏感数据进行“加密存储”也是系统提供的安全策略；<br>数据加密(data encryption)：防止数据库中数据存储和传输失密的有效手段；</p>
<p>数据库的完整性：防止数据库中存在不符合语义的数据，其防范对象是不合语义的、不正确的数据。</p>
<br/>

<br/>

<p>事务：是具有完整逻辑意义的数据库操作序列，对于数据库而言，这些操作是一个不可分割的逻辑工作单元，要么都做，要么都不做。是竞争资源、并发控制和恢复的基本单元</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">事务提交：完成执行结果永久化，释放占有的全部资源</span><br><span class="line"></span><br><span class="line">事务回滚：中止当前事物或撤销所作的更新，并时放全部资源</span><br></pre></td></tr></table></figure>

<p>为了保证事物并发执行或发生故障时数据库的一致性</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">事务应具有以下ACID特性：</span><br></pre></td></tr></table></figure>

<p>原子性(atomicity)。事务的所有操作要么全部都被执行，要么都不被执行。<br>一致性(consistency)。一个单独执行的事务应保证其执行结果的一致性，即总是将数据库从一个一致性状态转化到另一个一致性状态。<br>隔离性(isolation)。当多个事务并发执行时，一个事务的执行不能影响另一个事务，即并发执行的各个事务不能互相干扰。<br>持久性(durability)。一个事务成功提交后，它对数据库的改变必须是永久的，即使随后系统出现故障也不会受到影响。</p>
<br/>

<p>并发控制：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">悲观：事物访问数据对象前必须采取措施，基于封锁的并发控制，即事前控制</span><br><span class="line"></span><br><span class="line">乐观：事物结束时才验证数据库的一致性是否收到破坏，基于有效性的验证，即事后验证</span><br></pre></td></tr></table></figure>

<br/>

<p>基于封锁：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">基本思想：当事务T需访问数据对象Q时，先申请对Q的锁。如批准获得，则事务T继续执行，且此后不允许其他任何事务修改Q，直到事务T释放Q上的锁为止。</span><br></pre></td></tr></table></figure>

<p>基本锁类型：</p>
<p>共享锁（shared lock, 记为S）：如果事务T获得了数据对象Q的共享锁，则事务T可读Q但不能写Q。<br>排它锁（eXclusive lock, 记为X）：如果事务T获得了数据对象Q上的排它锁，则事务T既可读Q又可写Q。</p>
<p>锁相容：只有共享锁和共享锁相容，排他锁和其他所都不容</p>
<br/>

<p>虑并发事务T1、T2和T3，它们申请锁和释放锁的规则是：<br>访问数据对象前根据操作类型申请锁；<br>访问完后立即释放锁；<br>当一个事务释放锁后，由等待时间较长的事务优先获得锁。</p>
<p>存在问题：读脏数据、不可重复读和不可串行化，因为过早释放了持有的锁</p>
<br/>

<p>日志是DBMS记录数据库全部更新操作的序列文件</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">特点是：</span><br><span class="line"></span><br><span class="line">    记录了全部更新顺序，是一个追加文件，允许事物的并发执行导致文件交错，单个事务的日志顺序和该事务更新操作顺序一致，先写到日志缓冲区、在写到稳固存储器。</span><br></pre></td></tr></table></figure>

<p>日志有两种类型：记录数据更新操作的日志记录，包括UPDATE、INSERT和DELETE操作；<br>记录事务操作的日志记录, 包括START、COMMIT和ABORT操作</p>
<br/>

<p>undo是撤销影响，对于要UNDO的事务T，日志中记录有&lt;T, START&gt;以及T对数据库的所有更新操作的日志记录，即从日志尾向日志头反向恢复旧值，避免undo的操作可以让T对数据库所有更新值在&lt;T,Commit&gt;前不能写到磁盘上，这样，如果没有看到事务T 的&lt;T, COMMIT&gt;日志记录，就一定没有写到磁盘，</p>
<br/>

<p>对于要REDO的事务T，日志中已经记录了&lt;T, START&gt;、T的所有更新操作日志以及&lt;T, COMMIT&gt;。事务对数据库的所有更新值必须在提交日志&lt;Ti, COMMIT&gt;写到磁盘之前写到磁盘，就可以避免REDO操作。</p>

            </div>

            <!-- Post Comments -->
            
    <!-- 使用 DISQUS_CLICK -->
<div id="disqus-comment">
    <div id="disqus_thread"></div>

<!-- add animation -->
<style>
	.disqus_click_btn {
            line-height: 30px;
            margin: 0;
            min-width: 50px;
            padding: 0 14px;
            display: inline-block;
            font-family: "Roboto", "Helvetica", "Arial", sans-serif;
            font-size: 14px;
            font-weight: 400;
            text-transform: uppercase;
            letter-spacing: 0;
            overflow: hidden;
            will-change: box-shadow;
            transition: box-shadow .2s cubic-bezier(.4, 0, 1, 1), background-color .2s cubic-bezier(.4, 0, .2, 1), color .2s cubic-bezier(.4, 0, .2, 1);
            outline: 0;
            cursor: pointer;
            text-decoration: none;
            text-align: center;
            vertical-align: middle;
            border: 0;
            background: rgba(158, 158, 158, .2);
            box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .14), 0 3px 1px -2px rgba(0, 0, 0, .2), 0 1px 5px 0 rgba(0, 0, 0, .12);
            color: #fff;
            background-color: #7EC0EE;
            text-shadow: 0
        }
</style>
	
<div class="btn_click_load" id="disqus_bt"> 
    <button class="disqus_click_btn">点击查看评论</button>
</div>

<!--
<script type="text/javascript">
$('.btn_click_load').click(function() {
    /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
    var disqus_shortname = 'http-miccall-tech'; // required: replace example with your forum shortname

    /* * * DON'T EDIT BELOW THIS LINE * * */
    (function() {
      var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
      dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
      (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();

    document.getElementById('disqus_bt').style.display = "none";
});
</script>
-->
<script type="text/javascript">
    var disqus_config = function () {
        this.page.url = 'http://example.com/2021/06/26/database/';  // Replace PAGE_URL with your page's canonical URL variable
        this.page.identifier = 'http://example.com/2021/06/26/database/'; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
    };
</script>

<script type="text/javascript">
    $('.btn_click_load').click(function() {  //click to load comments
        (function() { // DON'T EDIT BELOW THIS LINE
            var d = document;
            var s = d.createElement('script');
            s.src = '//http-miccall-tech.disqus.com/embed.js';
            s.setAttribute('data-timestamp', + new Date());
            (d.head || d.body).appendChild(s);
        })();
        $('.btn_click_load').css('display','none');
    });
</script>
</div>
<style>
    #disqus-comment{
        background-color: #eee;
        padding: 2pc;
    }
</style>


        </div>
        <!-- Copyright 版权 start -->
                <div id="copyright">
            <ul>
                <li>&copy;Powered By <a target="_blank" rel="noopener" href="https://hexo.io/zh-cn/" style="border-bottom: none;">hexo</a></li>
                <li>Design: <a target="_blank" rel="noopener" href="http://miccall.tech " style="border-bottom: none;">miccall</a></li>
            </ul>
            
                <span id="busuanzi_container_site_pv">本站总访问量<span id="busuanzi_value_site_pv"></span>次</span>
			
			<div style="width:300px;margin:0 auto; padding:20px 0;">
		 		<a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=44060502002469" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;"><img src="" style="float:left;"><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">粤公网安备 44060502002469号</p></a>
		 	</div>
        </div>
    </div>
</body>



 	
</html>
